
var http = require("http");
var url = require("url");
var path = require("path");
var qs = require("querystring");
var fs = require("fs");
var fsp = require("fs").promises;

var { renderFile } = require("./tool/renderFile");

var { createServer } = http;

// 注意:
// node -> http搭建的服务默认是没有站点的概念的 => 需要自己搭建

// 如何搭建站点?  站点 => 用于存放前端代码的文件夹 => 通过访问该服务器的url地址 => 找到对应的文件渲染到浏览器

// 通过前端输入的url地址 => 找到对应的文件 => 读取返回给前端 => 前端渲染到浏览器中即可
// 简单来说 => 前端发送请求(请求方式 请求地址 空行 携带数据) => 后端接收请求(对应请求地址 从站点找到定义文件) => 读取该文件 =>将文件数据作为内容响应

// 指定一个文件夹作为默认站点(site) => 用于存放前端的代码


// 数据处理  接收前端以get/post方式传递的数据 => 处理

var server = createServer(function (req, res) { // 每次客户端-> 服务器发送请求都会执行的回调函数
    // req => request => 包含请求相关的信息(对象)
    // req.method => 请求的方式
    // req.url => 请求的url地址
    if (req.url != "/favicon.ico") { // 排除网站图标
        // console.log("----------------------前端发送请求过来了------------------");
        // console.log(req.url);
        var obj = url.parse(req.url);
        // console.log(obj);

        var { pathname } = obj; // 获取url中的文件路径

        // console.log(pathname);  // 除了站点中使用的必要路径之外 => 还有很多空余路径 => 可以使用不同的路径对应不同的html

        // 路由: 可以通过指定url 快捷访问站点下的某个或某些文件  => 返回响应数据 (根据路径=>快捷访问页面/数据接口)
        //  /          根路由  => 渲染主页面
        //  /xxx       一级路由 =>  对应路由渲染不同的文件/数据
        //  /xxx/xxx   一级路由的子路由  

        if (pathname == "/") { //  /  根路由 => 渲染主页面
            renderFile("/html/index.html", res);
        } else if (pathname == "/login") {  // /xxx 一级路由
            renderFile("/html/login.html", res);
        } else if (pathname == "/reg") {
            renderFile("/html/register.html", res);
        } else if (pathname == "/search") {
            renderFile("/html/search.html", res);
        } else if (pathname == "/detail") {
            renderFile("/html/detail.html", res);
        } else if (pathname == "/data") {  //对应路由显示数据
            fsp.readFile(path.join(__dirname, "./data/data.json"), "utf-8").then(data => {
                // data =>读取的文本 =>json字符串
                res.writeHead(200, {
                    "Content-Type": "text/json;charset=utf-8",
                })
                res.end(data, "utf-8");
            }).catch(err => {
                res.end(err.message);
            })
        } else if (pathname == "/data/user") {  //对应路由显示数据 (data->user)
            fsp.readFile(path.join(__dirname, "./data/data.json"), "utf-8").then(data => {
                // data =>读取的文本 =>json字符串
                var obj = JSON.parse(data);  //json字符串转对象

                var user = obj.user; // 数组

                res.writeHead(200, {
                    "Content-Type": "text/json;charset=utf-8",
                })
                res.end(JSON.stringify(user), "utf-8");
            }).catch(err => {
                res.end(err.message);
            })
        } else if (pathname == "/data/list") {  //对应路由显示数据 (data->list)
            fsp.readFile(path.join(__dirname, "./data/data.json"), "utf-8").then(data => {
                // data =>读取的文本 =>json字符串
                var obj = JSON.parse(data);  //json字符串转对象

                var list = obj.list; // 数组

                res.writeHead(200, {
                    "Content-Type": "text/json;charset=utf-8",
                })
                res.end(JSON.stringify(list), "utf-8");
            }).catch(err => {
                res.end(err.message);
            })
        } else if (pathname == "/data/pro") {  //对应路由显示数据 (data->pro)
            fsp.readFile(path.join(__dirname, "./data/data.json"), "utf-8").then(data => {
                // data =>读取的文本 =>json字符串
                var obj = JSON.parse(data);  //json字符串转对象

                var pro = obj.pro; // 数组

                res.writeHead(200, {
                    "Content-Type": "text/json;charset=utf-8",
                })
                res.end(JSON.stringify(pro), "utf-8");
            }).catch(err => {
                res.end(err.message);
            })
        } else if (pathname == "/req") {

        } else {
            // 对应文件路径 从站点中请求对应的文件返还给前端 /html/index.html
            renderFile(pathname, res);
        }


    }

})

// request 事件 => 接收前端请求会触发此事件  => 同上面的回调函数
server.on("request", function (req, res) {
    console.log("----------------------前端发送请求过来了------------------");
    var obj = url.parse(req.url);
    // console.log(obj);
    var { pathname, query } = obj; // 获取url中的文件路径
    // console.log(pathname);
    if (pathname == "/req") {
        // get  => 以get方式传递数据时 会将数据拼接到url之后  /req?user=zxczxc&pwd=123123
        if (query) {
            req.query = qs.parse(query);  // 给req对象设置一个自定义属性 =>req.query => 用于存放以get方式传递的数据解析
            console.log("get", req.query);
        }

        // post  => 以post方式传递数据时 => 在请求主体中携带
        // 如何获取请求主体中的数据?
        var body = "";  //用于拼接数据 

        // 接收数据时会触发此事件
        req.on("data", function (chunk) {  //chunk 数据流
            // console.log(chunk);
            body += chunk;
        })

        // 数据传输接收之后 触发此回调函数
        req.on("end", function () {
            // console.log("body", body);
            if (body) {
                req.body = qs.parse(body);  // 给req对象设置一个自定义属性 =>req.body => 用于存放以post方式传递的数据解析
                console.log("post", req.body);

            }
        })


        res.end();




    }

})

server.listen(5000, function () {
    console.log("server is started at: localhost:5000");
})